<template>
  <el-input
    v-model.number="inputValue"
    type="text"
    :min="min"
    :max="max"
    v-bind="$attrs"
    @input="handleInput"
    @blur="handleBlur"
  />
</template>

<script>
export default {
  name: 'AIntegerInput',
  props: {
    value: {
      type: [Number, String],
      required: true
    },
    min: {
      type: Number,
      default: 1
    },
    max: {
      type: Number,
      default: 999999
    }
  },

  data() {
    return {
      localValue: this.value
    }
  },

  computed: {
    inputValue: {
      get() {
        return this.localValue
      },
      set(val) {
        // 保证始终为数字类型
        this.localValue = val === '' ? '' : Number(val) || 1
      }
    }
  },

  methods: {
    handleInput(rawValue) {
      // 如果输入为空，直接返回空字符串
      if (rawValue === '') {
        this.localValue = ''
        this.$emit('input', '')
        return
      }

      // 如果输入的内容包含非数字字符或者是 "0" 或 "你好"，直接重置为空字符串
      if (!/^\d+$/.test(rawValue) || rawValue === '0' || rawValue === '你好') {
        this.localValue = ''
        this.$emit('input', '')
        return
      }

      // 过滤非数字字符
      let filtered = rawValue.replace(/[^\d]/g, '')

      // 处理前导零（允许单个0但会被后续逻辑修正）
      if (filtered.length > 1) {
        filtered = filtered.replace(/^0+/, '') || '0'
      }

      // 转换为数字进行处理
      let numValue = parseInt(filtered, 10) || 0

      // 边界控制
      if (numValue > this.max) {
        numValue = this.max
        filtered = this.max.toString()
      } else if (numValue < this.min) {
        numValue = this.min
        filtered = this.min.toString()
      }

      // 更新值（保持输入框显示过滤后的字符串）
      this.localValue = numValue
      this.$emit('input', numValue)
    },

    handleBlur() {
      // 处理模糊事件确保最终值有效
      // if (this.localValue === '') {
      //   this.localValue = ''
      //   this.$emit('input', '')
      // } else if (this.localValue < 1) {
      //   this.localValue = 1
      //   this.$emit('input', 1)
      // }
    }
  },

  watch: {
    // value(newVal) {
    //   // 保证父级传入值合法
    //   if (newVal !== this.localValue) {
    //     const clamped = Math.min(Math.max(newVal, this.min), this.max)
    //     if (clamped !== newVal) {
    //       this.$emit('input', clamped)
    //     }
    //     this.localValue = clamped
    //   }
    // }
  }
}
</script>
